#include "keyandmouse.h"
#include "myeventfilter.h"
#include <QMouseEvent>
#include <QEvent>
#include <QDebug>
keyAndMouse::keyAndMouse(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪
//    setMouseTracking(true);
    //如果是在QLable中设置键盘事件，需要设置焦点
    //setFocusPolicy(Qt::StrongFocus);
    //安装事件过滤器
//    myEventFilter *filter = new myEventFilter(this);
//    installEventFilter(filter);
}

//鼠标进入事件
void keyAndMouse::enterEvent(QEvent *event)
{
    //qDebug()<<"鼠标进入lable";
}
//鼠标离开事件
void keyAndMouse::leaveEvent(QEvent *event)
{
    //qDebug()<<"鼠标离开lable";
}

//鼠标移动事件
void keyAndMouse::mouseMoveEvent(QMouseEvent *ev)
{
    //鼠标移动事件只会返回Qt::NoButton
    //要用复合按钮
    // if(ev->buttons() & Qt::LeftButton)
    // {
    // QString str=QString("鼠标移动了 x=%1 y=%2 globalx=%3 globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
    // qDebug()<<str;
    // }
    QString str = QString("鼠标移动了 x=%1 y=%2 globalx=%3 globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
    qDebug() << str;
}
//鼠标按下事件
void keyAndMouse::mousePressEvent(QMouseEvent *ev)
{
    //普通的x,y是基于lable的
    //globalx,y是基于电脑屏幕的
    if(ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下了 x=%1 y=%2 globalx=%3 globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

//鼠标释放事件
void keyAndMouse::mouseReleaseEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标释放了 x=%1 y=%2 globalx=%3 globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

//键盘按下事件,当安装事件过滤器的时候，优先走事件过滤器
void keyAndMouse::keyPressEvent(QKeyEvent *ev)
{
    if(ev->key() == Qt::Key_B) {
        qDebug() << "键入B";
    }
}
//键盘释放事件
void keyAndMouse::keyReleaseEvent(QKeyEvent *ev)
{
    qDebug() << "按键释放了";
}

//事件分发
bool keyAndMouse::event(QEvent *e)
{
    //事件分发器可以手动拦截事件
    //拦截鼠标点击事件
    if(e->type() == QEvent::MouseButtonPress) {
        QMouseEvent *ev = static_cast<QMouseEvent *>(e);
        QString str = QString("Event 鼠标按下了 x=%1 y=%2 globalx=%3 globaly=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
        return true;//表示消费了此事件，不向下分发
    }
    //其他事件，交给父类处理，正常下发
    return QLabel::event(e);
}
